const fs       = require('fs'),
	http       = require('http'),
	gulp       = require('gulp'),
	del        = require('del'),                              // 删除
	iconfont   = require('gulp-iconfont'),                    // 将 SVG 生成图标字体(TTF/EOT/WOFF/)
	uglify     = require('gulp-uglify'),                      // 压缩JS
	rename     = require('gulp-rename'),                      // 重命名
	argv       = require('minimist')(process.argv.slice(2)),  // 命令行传参
	sass       = require('gulp-sass'),                        // 编译 Sass
	cleanCss   = require('gulp-clean-css'),                   // 压缩 CSS
	autoprefix = require('gulp-autoprefixer');                // 处理 CSS 浏览器前缀

const buildPath = './build/',
	pathConfig = require(buildPath + 'path');  // 路径目录配置

// 控制台任务分隔线
var consoleLine	= '',
	lineWide = 80;
for (let i = 0; i < lineWide; i++) {
	consoleLine += '-';
}

//\\----------------------------------------------------------------------------//\\

/**
 * 图标字体任务
 */
var getFontURLs = require(buildPath + 'get_font_url'),
	removeRepeat = require(buildPath + 'remove_repeat');

gulp.task('icon', function() {
	del([
		pathConfig.icon.dist + '*.*',
		pathConfig.icon.dest + '*.*'
	]).then(function(paths) {
		console.log(consoleLine);
		console.log('[Running] 清理旧字体文件：\n', paths.join('\n '));
		console.log('[Done] 清理完毕！');
		console.log(consoleLine);
		console.log('[Running] 开始下载 iconfont 资源：');
		runIconTask();
	});
});

/**
 * 拉取第三方网站上生成的 iconfont 资源
 * @desc 资源拉取自：阿里巴巴矢量图标库 (iconfont.cn)
 */
function runIconTask() {
	var iconfontURL = pathConfig.icon.src;

	http.get('http:' + iconfontURL, function(res) {
		res.setEncoding('utf8');

		var cssContent = '';  // 内容字符串

		// 下载数据
		res.on('data', function(chunk) {
			cssContent += chunk;
		});

		// 下载完成
		res.on('end', function() {
			var regRule = new RegExp(/(?=url\(\W)\S+(?=\W\))/, 'g');  // output: url('//xxx//xx.xx?t=xxxxx
			var fontURLs = removeRepeat(getFontURLs(cssContent, regRule));

			// console.log(fontURLs)
			modifyFontCSS(fontURLs, cssContent, regRule);
			downloadFonts(fontURLs);
		});
	});
}

/**
 * 修改 CSS 中字体远程路径为本地路径
 * @param {array} fonts - 字体路径数组
 * @param {string} data - CSS 文本内容
 * @param {regExp} regEx - 正则
 */
function modifyFontCSS(fonts, data, regEx) {
    fonts.forEach(item => {
        var fontName = returnFontName(item),
            fontHost = item.replace(fontName, ''),
            regEx = new RegExp(fontHost + fontName, 'g');

        data = data.replace(regEx, function(match) {
            return '../fonts/' + fontName;
        });
    });

	// 将调整完字体路径的 CSS 写入本地
	var cssName = 'basic_iconfont.css';

    fs.writeFile(pathConfig.sass.dest + cssName, data, function(err) {
        if (err) {
            throw err;
		}

		console.log('[Done] iconfont 样式表下载成功：' + cssName);
		gulp.src()

		//runCSSTask(cssName);
    });
}

/**
 * 从远程地址下载字体到本地
 * @param {array} urlArr - 字体远程地址
 */
function downloadFonts(urlArr) {
	var distLocal = pathConfig.icon.dist;

    urlArr.forEach(url => {
		var fileName = returnFontName(url),
			localFile = distLocal + fileName,
            fileStream = fs.createWriteStream(localFile);

        http.get('http:' + url, function(res) {
            res.pipe(fileStream);  // 文件流写入

            // 下载完成
            res.on('end', function() {
				console.log('[Done] 下载成功：' + fileName);

				// 复制一份到 dest 目录
				gulp.src(localFile)
					.pipe(gulp.dest(pathConfig.icon.dest));
            });
        });
	});
}

/**
 * 返回 url 地址中的字体名称
 * @param {string} url - 字体 url 地址
 * @returns {string} 字体名称
 */
function returnFontName(url) {
    return url.substr(url.lastIndexOf('/') + 1);
}
